	/*
 * Cr�� le 18 mars 06
 */
package fr.cdesire.sudoku.applet;

import fr.cdesire.sudoku.elements.Sudoku;
import fr.cdesire.sudoku.elements.exceptions.NotSudokuSolutionException;
import fr.cdesire.sudoku.elements.exceptions.NotValidSudokuGridException;
import java.applet.Applet;
import java.awt.Graphics;
import java.util.Calendar;

/**
 * @author Cedric
 * Cette classe affiche la solution d'une grille Sudoku.
 */
public class GrilleSudoku extends Applet {

    private Sudoku sudoku;
    int[][] tab;
    long duree;
    String messageErreur;

    /**
     * Initialisation de l'applet : R�cup�ration des valeurs pass�es en param�tre,
     * appel de la m�thode statique de recherche de solution.
     */
    @Override
    public void init() {

        tab = new int[Sudoku.NB_CASES_LIGNE_GRILLE][Sudoku.NB_CASES_LIGNE_GRILLE];

        for (int i = 0; i < Sudoku.NB_CASES_LIGNE_GRILLE; i++) {
            for (int j = 0; j < Sudoku.NB_CASES_LIGNE_GRILLE; j++) {
                String param;
                int val;
                try {
                    param = this.getParameter("L" + i + "C" + j);
                    val = param.equals("") ? 0 : Integer.parseInt(param);
                } catch (NullPointerException e) {
                    val = 0;
                }
                tab[i][j] = val;
            }
        }

        long deb = Calendar.getInstance().getTime().getTime();

        try {
            sudoku = new Sudoku(tab);
            sudoku.validation();
            sudoku = Sudoku.rechercheSolution(sudoku);
            tab = sudoku.getGrille();
        } catch (NotSudokuSolutionException e1) {
            messageErreur = e1.getMessage();
        } catch (NotValidSudokuGridException e2) {
            messageErreur = e2.getMessage();
        }

        long fin = Calendar.getInstance().getTime().getTime();
        duree = fin - deb;
    }

    /**
     * Affichage de la solution.
     */
    @Override
    public void paint(Graphics g) {

        int espaceCol = 10;
        int espaceLigne = 10;

        if (messageErreur == null) {
            for (int i = 0; i < Sudoku.NB_CASES_LIGNE_GRILLE; i++) {

                if (i != 0) {
                    if (i % 3 == 0) {
                        espaceLigne = espaceLigne + 30;
                    } else {
                        espaceLigne = espaceLigne + 20;
                    }
                }

                espaceCol = 10;

                for (int j = 0; j < Sudoku.NB_CASES_LIGNE_GRILLE; j++) {

                    if (j != 0) {
                        if (j % 3 == 0) {
                            espaceCol = espaceCol + 30;
                        } else {
                            espaceCol = espaceCol + 20;
                        }
                    }

                    g.drawString(String.valueOf(tab[i][j]), espaceCol, espaceLigne);
                }
            }
        } else {
            g.drawString(messageErreur, 10, 110);
        }
        g.drawString("Temps : " + String.valueOf(duree) + "ms", 10, 215);
    }
}
